perm filename PPK.FAI[HAK,HPM] blob sn#466162 filedate 1979-08-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	PPK
C00004 00003	 08/14/78 EJG *** bug below has supposedly been fixed ***
C00008 00004	BEG0:	SETOM	LINN
C00010 00005	BEG2:	PUSHJ P,HIDCHK
C00016 00006	EINIT:	SKIPE	EINITD
C00018 00007	HIDDEN←←200000		BIT IN LSTESC(LINE) RH
C00021 00008	LINED:
C00024 00009	LFEND:	SKIPN	NEEDLF		check if last line had lf
C00026 00010	DISP1:	MOVEI	C,0
C00029 00011	RCHNW:	MOVE C,[700,,WRD-1]
C00031 00012	APNT:	(A).		RH GETS CLOBBERED AT SETPR2 TIME
C00033 ENDMK
C⊗;
	TITLE	PPK
	A←1
	B←2
	C←3
	D←4
	E←5
	f←6
	ppos← 7
	pnt←10
	len←11
	NLFS←12
	col←13
	DAT←14
	CB←T←15
	TT←16
	P←17

	LPDL←←69
	BFSZ←←10000

	INTTTY←←20000	;interrupt bit for tty input (left half)
	TTYNUM←←221	;contains numbers of various kinds of terminal lines
	SYSTOP←←265
	CHKBEG←←223
        LEBUF←←330	;Displacement of actual line editor buffer from beginning of dpy hdr
	LEPOS←←334
	LSTESC←←333
	LINK←←65	;displacement in PP of link to next PP (DPYSER)
	JOBAPR←←125

	MAXWIN←←=33
	WTXTSZ←←MAXWIN*=100/5

CDPYBS:	2450		;value of DPYBSZ   (from E)  ***09/13/77 00:15--NOT USED***
ADPYBU:	1236		;address of DPYBUF (from E)  ***09/13/77 00:15--NOT USED***
AWINLI:	0;13217		;address of WINLIN (from E)
ABOTST:	0;4123		;address of BOTSTR (from E)
AHEDBL:	0;13223		;address of HEDBLK (from E)
ATRLBL:	0;13222		;address of TRLBLK (from E)

resstr:	4000,,520		;<break>P
reswho:	4000,,127		;<esc>W (gets changed)
respag:	resstr-.,,resstr
; 08/14/78 EJG *** bug below has supposedly been fixed ***
; 07/05/78 EJG - someday fix to do tabs right - bug e.g. PPKing on a DSKSIZ on DM
START:
	CALLI	A,24
	HRRZ	A,A
	MOVEM	A,TESTXX#
	SETZM	TESTYY#
 	MOVN	B,[=30337167360]
 	CAIE	A,=154279
 	CAIN	A,=199526
 	CAIA
 	CAIN	A,=166957
	SETOM	TESTYY
	SKIPE	TESTYY
	CALLI	B,43
	movni a,1
	getlin a			;get type of terminal
	movem a,trmtyp			;save for later
	movei b,2*=60			;default initial time between updates
	tlne a,40000
	 movei b,7*=60			;slower on DMs
	movem b,slptim
	HRROI	C,[015000,,D]
	TTYSET C,		;get display height in D
	SUBI   D,3		;-3 for who line 
	MOVEM  D,DPYHT
	HRROI	B,[42000,,B]
	TTYSET	B,			;GET CURRENT WHOLINE JOB NUMBER IN B
	LSH	B,=9
	SKIPG	B
	MOVEI	B,200
	ADD	B,[4000,,200+"W"]	;CREATE ESC-#-W OR BREAK-W AS NEEDED
	MOVEM	B,RESWHO
	HRRZI	A,[DISMIS]		;INTERRUPT ROUTINE WILL WAKE US UP IF
	MOVEM	A,JOBAPR		;TTY INPUT OR CLOCK RUNS OUT
	MOVSI	A,INTTTY
	INTENB	A,

START0:	SETZM	EMODE
	SETOM	LINN

	MOVE P,[-LPDL,,PDL]

	MOVEI	A,LEBUF
	PEEK	A,
	MOVEM A,DLEBUF		;Displacement of editor buffer from dpy hdr addr
	MOVEI	A,LEPOS
	PEEK	A,
	MOVEM A,DLEPOS		;Displacement of editor position

	MOVEI B,TTYNUM
	PEEK B,
	MOVEI C,0
	MOVEI A,0
	LSHC A,9
	ADDI C,(A)
	JUMPN B,.-3
	MOVEM C,TTYMAX#

	MOVEI A,CHKBEG
	PEEK A,
	MOVEM A,CCHKBEG
	LSH A,-9                ;# LO PIECE PAGES
	MOVEI B,SYSTOP
	PEEK B,
	PEEK B,
	MOVE C,CCHKBEG
	SUB C,B
	MOVEM C,CBMST		;CHKBEG-SYSTOP
	LSH B,-9+5              ;STARTING HI PIECE PAGE # * 40
	ADDI B,10               ;SET 2-PIECE FLAG
	HRL B,A
	MOVEM B,XGETHI
	GETHI B,
	 JRST 4,.

	MOVE A,400321
	HLRZM A,TBLKPT
	HRRZM A,TPJMP
	MOVE A,400322
	HRRZM A,PPCALL
	MOVE A,400236
	MOVEM A,JBTLIN
	MOVE A,400237		;GET POINTER TO LETAB ENTRY OF FIRST III
	MOVEM A,LETAB
	LDB A,[POINT 9,400221,8] ;GET SCNNUM (NUMBER OF TTYS), WHICH IS ALSO
	MOVEM A,DPYL0#		 ; THE NUMBER OF THE FIRST III
BEG0:	SETOM	LINN
BEG:	MOVE	A,LINN
	JUMPGE	A,BEG2
	OUTSTR	[ASCIZ/Line? /]
NXCH:	INCHWL	A
HACH:	CAIN	A,175
	JRST	BEG			;USE ALT TO WAKE UP EARLY
	CAIN	A,15
	JRST	[  INCHWL
		   EXIT 1,
		  JRST START0]
	CAIE	A,11
	CAIN	A,40
	JRST	NXCH
	SUBI	A,60
REELUP:	INCHWL	C
	CAIN	C,15
	 JRST	[INCHRW  T
		JRST    BEG3A]
	LSH	A,3
	ADDI	A,-"0"(C)
	JRST	REELUP
BEG3A:	CAIL	A,0			;CHECK FOR REASONABLENESS
	CAMLE	A,TTYMAX
	JRST	[ OUTSTR [ASCIZ/Invalid line number!
/]
CRUFT:		  move a,respag		;block to reset the page printer
		  ttyset a,
		  JRST START0]
	MOVEM	A,LINN
	SETZM	HIDFLG#			;NEW NUMBER, HAVEN'T YET CHECKED HIDE BIT
	MOVEI	B,LSTESC
	PEEK	B,
	MOVEI	B,(B)			;DISCARD JUNK FROM LH
	ADDI	B,(A)
	MOVEM	B,HIDWRD#
	PUSHJ	P,HIDCHK
	JRST	BEG0
	LSH	A,9			;TYPE <BRK> <LINE NUMBER> W
	ADD	A,[4000,,600+"W"]
	HRROI	B,[42000,,B]		;BUT FIRST...
	TTYSET	B,			;GET CURRENT WHOLINE JOB NUMBER IN B
	JUMPLE	B,NOWHO			;IF NONE, DON'T SHOW WHOLINE
	HRROI	B,A
	TTYSET	B,
NOWHO:	MOVE	A,LINN
	JRST	BEG2A
BEG2:	PUSHJ P,HIDCHK
	JRST BEG0
BEG2A:	ADD A,LETAB		;ADD POINTER TO FIRST III'S LETAB ENTRY
	SUB A,DPYL0
	MOVEI	B,400000(A)
	MOVEM	B,LEENT
	HRRZ 	A,400000(A)
	JUMPE	A,[ OUTSTR [ASCIZ/Not in use or not a display.
/]
		  JRST CRUFT]

	MOVE T,CBMST
	ADDI T,400000
	HRRM T,APNT
	SUBI T,2
	HRLI T,-20
	MOVSM T,JMPOFF
	ADD A,PPCALL
	HLRZ A,@APNT
	SKIPN EMODE
	JRST NEMODE
	MOVE B,A
	ADDI A,LINK		;go to secondary PP if E mode
	HRRZ A,@APNT
	SKIPN A			;but not if there isn't one
	MOVE A,B
NEMODE:	MOVEI B,1(A)
	ADD B,TPJMP
	HRLM B,ENDTST
	ADD A,TBLKPT
	HRRZ A,@APNT
	ADD A,APNT
	HRLI A,444400
	MOVEM A,DLISTL
	SETZM CCNT
	SETZM MAYTAB
	MOVNI A,69
	MOVEM A,BLKCNT

	SKIPN EMODE
	JRST NEMOD2
	PUSHJ	P,EINIT
	 JRST	NEMOD2		;EINIT failed
	MOVEI A,B
	MOVE B,LINN
	TTYJOB B,

	HRRO	C,AWINLI
	MOVEI	D,WINLIN
	JOBRD	A,
	 JRST	NEMOD2
	MOVE	C,WINLIN
	MOVEM	C,ANXTLN
	MOVE	C,[WINBLK,,WINBLK+1]
	SETZM	-1(C)
	BLT	C,WINBLK+MAXWIN-1
	MOVE	E,[-MAXWIN-1,,WINBLK-1]		;pointer list
	MOVE	F,[-WTXTSZ+40,,WINTXT]		;text storage

	HRRO	C,AHEDBL
	MOVEI	D,HEDBLK
	JOBRD	A,
	 JRST	NEMOD2
	HRRO	C,ATRLBL
	MOVEI	D,TRLBLK
	JOBRD	A,
	 JRST	NEMOD2

	MOVE	C,HEDBLK
	ADD	C,[-40,,-1]
	HRRZ	D,F
	JOBRD	A,
	 JRST	NEMOD2
	HRRZ	C,(F)		;total wdcount
	ADDI	C,-2(F)		;last text wd
	HRLZ	C,C		;to LH
	HRRI	C,4(F)		;first text wd
	MOVEM	C,DLHED
	HRRZ	C,(F)		;total wdcount
	HRL	C,C		;in both halves
	ADD	F,C		;update textptr
	SETZM	-1(F)		;Sigh.  To stop text group.

	MOVE	C,TRLBLK
	ADD	C,[-40,,-1]
	HRRZ	D,F
	JOBRD	A,
	 JRST	NEMOD2
	HRRZ	C,(F)		;total wdcount
	ADDI	C,-2(F)		;last text wd
	HRLZ	C,C		;to LH
	HRRI	C,4(F)		;first text wd
	MOVEM	C,DLTRL
	HRRZ	C,(F)		;total wdcount
	HRL	C,C		;in both halves
	ADD	F,C		;update textptr
	SETZM	-1(F)		;Sigh.  To stop text group.

EWINLP:	MOVE	C,ANXTLN
	CAMN	C,ABOTST
	JRST	EWINDN	;finished (bottom of page)
	AOBJP	E,EWINDN;finished (MAXWIN lines done)
	JUMPGE	F,EWINDN;out of space (in text area)
	ADD	C,[-40,,-1]
	HRRZ	D,F
	JOBRD	A,
	 JRST	NEMOD2
	HRRZ	C,1(F)
	MOVEM	C,ANXTLN
	HRRZ	C,(F)		;total wdcount
	ADDI	C,-2(F)		;last text wd
	SKIPGE	3(F)
	SUBI	C,3		;correct last wd adr if page mark line
	HRLZ	C,C		;to LH
	HRRI	C,4(F)		;first text wd
	MOVEM	C,(E)
	HRRZ	C,(F)		;total wdcount
	CAILE	C,100
	JRST	NEMOD2
	HRL	C,C		;in both halves
	ADD	F,C		;update textptr
	SETZM	-1(F)		;Sigh.  To stop text group.
	JRST	EWINLP
EWINDN:

	MOVEI A,DLIST
	CAIA
NEMOD2:	MOVEI A,DLISTL
	MOVEM A,DLISTP
	HRRZ A,(A)
	HRLI A,444400
	MOVEM A,WRDP

	MOVEI F,0
	MOVEI NLFS,0
	MOVEI LEN,0
	MOVE PNT,[POINT 7,PPAGE+2]
LF0:	MOVEI COL,0
LF1:	PUSHJ P,RCH
	JRST LINED
	CAIN C,12
	JUMPE F,[ LDB C,PNT	;empty line, must put a space on it
		  CAIN C,15	;to make sure display gets cleared
		  SOJA LEN,$.+2	;if cr present, overwrite with space
		  IBP PNT	;if no cr, skip to new position
		  MOVEI C,40
		  DPB C,PNT
		  MOVEI C,15
		  IDPB C,PNT
		  MOVEI C,12
		  IDPB C,PNT
		  ADDI LEN,3
		  AOJA NLFS,LF0]
	CAIA C,15
	MOVEI F,-12(C)	;remember if last non-cr was a lf
        IDPB C,PNT
	CAIN C,12
	JRST [ADDI NLFS,1
	      AOJA LEN,LF0]
	CAIN C,11
	JRST LTAB
	ADDI COL,1
        AOJA LEN,LF1

LTAB:	MOVEI C,40
	IDPB C,PNT
	ADDI LEN,1
	ADDI COL,1
	TRNE COL,7
	 JRST LTAB
	AOJA LEN,LF1
EINIT:	SKIPE	EINITD
	JRST	CPOPJ1
	MOVE	B,LINN
	TTYJOB	B,
	JUMPLE	B,CPOPJ
	SEGNUM	B,
	JUMPE	B,CPOPJ
	DETSEG	0,
	PUSH	P,[EINRET]	;set exit to re-do GETHI
	ATTSEG	B,
	POPJ	P,

	MOVE	A,400011	;addr(BOTSTR)
	HRRZM	A,ABOTST
	MOVE	A,400016	;addr(DRAW)
	MOVE	A,3(A)		;DRAW+3: JRST DRAWM
	HLRZ	B,A
	CAIE	B,(<JRST>)
	POPJ	P,
	MOVE	A,0(A)		;DRAWM: PUSHJ P,DISP0
	HLRZ	B,A
	CAIE	B,(<PUSHJ 17,>)
	POPJ	P,
	MOVE	A,5(A)		;DISP0+5: PUSHJ P,WINCHK
	HLRZ	B,A
	CAIE	B,(<PUSHJ 17,>)
	POPJ	P,
	MOVE	C,A		;save PUSHJ P,WINCHK
	MOVE	A,-12(A)	;WINCHK-12: MOVEM T,WINLIN#
	HLRZ	B,A
	CAIE	B,(<MOVEM 15,>)
	POPJ	P,
	HRRZM	A,AWINLI
	MOVE	A,2(C)		;WINCHK+2: JRST CENWIN
	HLRZ	B,A
	CAIE	B,(<JRST>)
	POPJ	P,
	MOVE	A,4(A)		;CENWIN+4: AOJA A,SETWIN
	HLRZ	B,A
	CAIE	B,(<AOJA 1,>)
	POPJ	P,
	MOVE	C,A		;save AOJA A,SETWIN
	MOVE	A,6(A)		;SETWIN+6: MOVEM B,HEDBLK#
	HLRZ	B,A
	CAIE	B,(<MOVEM 2,>)
	POPJ	P,
	HRRZM	A,AHEDBL
	MOVE	A,12(C)		;SETWIN+12: MOVEM B,TRLBLK#
	HLRZ	B,A
	CAIE	B,(<MOVEM 2,>)
	POPJ	P,
	HRRZM	A,ATRLBL
	SETOM	EINITD
	JRST	CPOPJ1

EINRET:	CAIA
	AOS	(P)
	MOVE	A,XGETHI
	GETHI	A,
	 HALT	.
	POPJ	P,
HIDDEN←←200000		;BIT IN LSTESC(LINE) RH

HIDCHK:	SKIPE HIDFLG		;ALREADY OVERRIDDEN?
	JRST CPOPJ1		;YES, OK
	HRRZ B,TRMTYP		;GET OUR OWN LINE NUMBER
	MOVEM B,TTMTTY		;SAVE IN CASE NEEDED FOR OVERRIDE MSG
	CAMN B,LINN
	JRST CPOPJ1		;ALLOW PEEK OF HIDDEN SELF WITHOUT ASKING
	MOVE B,HIDWRD
	HRRZ CB,CCHKBEG		;BREAK IN NON-SHUFFLING SYSTEM
	CAIGE CB,(B)		;PAST BREAK IN SYSTEM?
	ADD B,CBMST		;ADD CHKBEG-SYSTOP
	MOVE B,400000(B)
	TRNE B,HIDDEN
	PUSHJ P,OVRRID		;HIDDEN--ASK IF WANT TO OVERRIDE (SKIP IF NOT)
CPOPJ1:	AOS (P)			;SKIP-RETURN UNLESS HIDDEN AND NOT OVERRIDING
CPOPJ:	POPJ P,

OVRRID:	PPSEL 0
	PGACT 0
	HRROI B,RESSTR		;RESTORE SCREEN
	TTYSET B,
	MOVEI B,1
	SLEEP B,		;Wait for screen redrawing
	OUTSTR [ASCIZ /Hidden (ESC H typed).  Override? /]
	CLRBFI
	INCHWL B
	CLRBFI
	CAIE B,"y"
	CAIN B,"Y"
	CAIA			;OK
	JRST CPOPJ1
	GETPPN B,
	MOVEM B,TTMPRG		;SAVE HERE TEMPORARILY
	HLLZS B
	MOVEI D,TTMPRJ
	PUSHJ P,TTMSIX
	HRLZ B,TTMPRG
	MOVEI D,TTMPRG
	PUSHJ P,TTMSIX
	MOVE B,TTMTTY
	MOVEI D,TTMTTY
	PUSHJ P,TTMOCT
	MOVE B,LINN		;TELL THE GUY
	MOVEM B,TTYMNO
	BEEP B,
	MOVEI B,TTYMNO
	NULMES B,
	 JFCL
	OUTSTR [ASCIZ /
The terminal you are spying on has been notified.
/]
	SETOM HIDFLG
	MOVEI B,2
	SLEEP B,		;GIVE HIM TIME TO SEE IT!
	POPJ P,

TTYMNO:	0
	BYTCNT,,TTMMES
TTMMES:	ASCII /;;You are being spied on with PPK by [/
TTMPRJ:	0
	ASCII /,/
TTMPRG:	0
	ASCII /] on TTY/
TTMTTY:	0
	ASCII /.
/
BYTCNT←←<.-TTMMES>*5

TTMSIX:	SETZM (D)		;NO EXTRANEOUS CHARACTERS
	HRLI D,440700
SIXLP:	MOVEI C,0
	ROTC B,6
	JUMPE C,SIXLP1
	ADDI C,40
	IDPB C,D
SIXLP1:	JUMPN B,SIXLP
	POPJ P,

TTMOCT:	SETZM (D)
	HRLI D,440700
OCTLP:	IDIVI B,10
	JUMPE B,OCTLP1
	HRLM C,(P)
	PUSHJ P,OCTLP
	HLRZ C,(P)
OCTLP1:	ADDI C,"0"
	IDPB C,D
	POPJ P,
LINED:
	MOVEM	F,NEEDLF#

	SKIPN DAT,@LEENT	; append line editor
	JRST LFEND
	MOVEI B,(DAT)
	ADD B,DLEPOS		;FIND LEYPOS CELL IN DPY HDR
	HRRZ CB,CCHKBEG		;BREAK IN NON-SHUFFLING SYSTEM
	CAIGE CB,(B)		;PAST BREAK IN SYSTEM?
	 ADD B,CBMST		;ADD CHKBEG-SYSTOP
	ADDI B,400000
	SKIPL B,(B)
	JRST ONSCRN		;SIGN BIT OFF, NORMAL LINE EDITOR POSITION
	LDB B,[POINT 11,B,21]	;SIGN BIT ON, CHECK POSITION (BITS 11:21)
	TRNN B,1⊗=10		;POSITIVE?
	CAIG B,1000		;OFF SCREEN?
	JRST ONSCRN		;PROBABLY NOT
	JRST LFEND		;YES

ONSCRN:	ADD DAT,DLEBUF		;Point to buffer itself
	CAIGE CB,(DAT)		;PAST BREAK IN SYSTEM?
        ADD DAT,CBMST		;ADD CHKBEG-SYSTOP
	ADDI DAT,400000
	MOVE F,DAT		;Make copy of pointer for depositing
	MOVEI A,1
LIE:	TDNE A,(DAT)		;Is this a text word?
	AOJA DAT,LIE		;Yes
CNTDN:	CAMN F,DAT
	JRST LFEND		;Empty line editor
	HRLI F,440700
	SUBI DAT,1		;Point to last real text word in buffer
	HRLI DAT,100700		;Byte pointer to char before EOLCHR in buffer

	MOVEM LEN,SAVLEN#	;in case LE ends with crlf(ie its been sent),
	MOVEM PNT,SAVPNT#	;save len and pnt so we can back up

LECS:	CAMN F,DAT		;check if end overstepped
	JRST LFOO
	ILDB C,F
	CAIE C,177
	CAIN C,14		;stop on funny characters
	JRST LFOO
	CAIE C,13
	CAIN C,0
	JRST LFOO
	CAIE C,15		;if line ends in <cr> or <lf>
	CAIN C,12		;its already been sent, dont dpy it
	JRST BACKUP
	CAIN C,175
	JRST BACKUP
	IDPB C,PNT		;normally, deposit
	AOJA LEN,LECS		;and account

LFOO:	SETOM	NEEDLF		;we didn't insert crlf
	JRST	LFEND

BACKUP:	SKIPN	EMODE		;if E mode, don't ever flush line editor
	JRST	BACKPU
	CAIE	C,12
	SETOM	NEEDLF
	JRST	LFEND
BACKPU:	MOVE	PNT,SAVPNT		;restore depositing byte pntr
	MOVE	LEN,SAVLEN		;and character cnt
LFEND:	SKIPN	NEEDLF		;check if last line had lf
	JRST	LFDONE		;if so, don't add extra one
	MOVEI	C,40
	IDPB	C,PNT		;otherwise add space cr lf
	MOVEI	C,15
	IDPB	C,PNT
	MOVEI	C,12
	IDPB	C,PNT
	ADDI	LEN,3
	ADDI	NLFS,1
LFDONE: SKIPLE	DPYHT		;if not a display, type out whole buffer
	CAMN	NLFS,DPYHT	;if just right number of lines
	JRST	DISP1		;display immediately
	CAML	NLFS,DPYHT	;if too few
	JRST	SQUISH
SPLOO:	MOVEI	C,40		;add blank lines
	IDPB	C,PNT
	MOVEI	C,15
	IDPB	C,PNT
	MOVEI	C,12
	IDPB	C,PNT
	ADDI	LEN,3
	ADDI	NLFS,1
	CAMGE	NLFS,DPYHT
	JRST	SPLOO
	JRST	DISP1	

SQUISH: MOVE	A,[POINT 7,PPAGE+2] ;must be too many lines, remove some
SQUASH:	ILDB	C,A
	CAIE	C,12
	JRST	SQUASH
	SUBI	NLFS,1
	CAMLE	NLFS,DPYHT
	JRST	SQUASH
	MOVE	PNT,[POINT 7,PPAGE+2]
	SETZ	LEN,
SQUOSH:	ILDB	C,A
	IDPB	C,PNT
	ADDI	LEN,1
	CAIE	C,12
	JRST	SQUOSH
	SOJG	NLFS,SQUOSH

	MOVE	NLFS,DPYHT
DISP1:	MOVEI	C,0
	REPEAT  10,{IDPB C,PNT}
	movei c,6(len)			;find number of words for string
	idivi c,5
	addi c,3+1
	hrrm c,buffpt+1

	move a,trmtyp			;get type of terminal
	TLNE A,40000
	JRST [MOVE B,DMAGE		;its a DM
	      MOVEM B,PPAGE
	      MOVE  B,DMAGE+1
              MOVEM B,PPAGE+1
              JRST GIOT]
	tlne a,20000
	JRST [MOVE B,DDAGE		;its a DD
	      MOVEM B,PPAGE
	      MOVE  B,DDAGE+1
              MOVEM B,PPAGE+1
              JRST GIOT]
	TLNE A,400000
	JRST [MOVE B,IIAGE		;its a III
	      MOVEM B,PPAGE
	      MOVE  B,IIAGE+1
              MOVEM B,PPAGE+1
	      PGACT 400000
	      DPYPOS -1000
              JRST GIOT]

	JRST [outstr	PPAGE+2			;not a dd - let outstr handle it.
	      JRST	PRTD]

GIOT:	UPGIOT	BUFFPT
	SETOM	PPAGE-1(C)		;set low order bit (DD UPG's clobber it)

PRTD:	SKIPN	A,SLPTIM
	MOVEI	A,777777		;αβ0 IMPLIES 3-DAY SLEEP
	CLKINT	(A)
	INTMSK	[0]
	MOVE	A,LINN
	INCHRS	B
	JRST	SNOOZE
	CLKINT	0
	INTMSK	[-1]
	JRST	AWAKE
SNOOZE:	IMSTW	[-1]
	CLKINT	0
	INCHRS	B
	JRST	BEG
AWAKE:	CAIN	B,15
	JRST	[INCHRW	B
		RESET
		move a,respag		;block to reset the page printer
		ttyset a,
		MOVEI A,1
		SLEEP A,
		EXIT 1,
		JRST START]
	CAIL	B,"0"+600
	CAILE	B,"9"+600
	CAIA
	JRST	[SUBI B,"0"+600
		 IMULI B,=60
		 MOVEM B,SLPTIM
		 JRST PRTD]
	MOVEI	A,(B)
	MOVE	C,TESTXX
	CAIN	C,=0
	JRST	HACH
	ANDI	B,137			;NO BUCKIES, UPPERCASE
	CAIN	B,"E"
	JRST	[SETOM EMODE		;Set E mode
		 JRST BEG]
	CAIN	B,"N"
	JRST	[SETZM EMODE		;Clear E mode - back to normal
		 JRST BEG]
	JRST	HACH
RCHNW:	MOVE C,[700,,WRD-1]
	MOVEM C,CHRP
	MOVEI C,5
	MOVEM C,CCNT
RCHNW2:	ILDB C,WRDP
	TRNN C,1
	JRST RCHNB
	MOVEM C,WRD
RCH:	SOSGE CCNT
	JRST RCHNW
	ILDB C,CHRP
	CAMN C,MAYTAB
	 JRST RCH
	JUMPE C,RCH
	JRST CPOPJ1

RCHNB:	MOVE A,DLISTP
	CAIN A,DLISTL
	JRST RCHNC		;jump if looking at plain old PP
	MOVEI C,11
	MOVEM C,MAYTAB		;set to ignore tabs, since E lines are wierd
	HLRZ A,(A)		;max WRDP
	HLL A,WRDP
	CAML A,WRDP
	JRST RCHNW2		;max ≤ WRDP, keep going
	AOS A,DLISTP
	CAIN A,DLISTL
	 SETZM MAYTAB		;reset to allow tabs if back to plain PP
	HRRZ A,(A)
	JUMPE A,RCHNB		;skip zero entries
	HRLI A,444400
	MOVEM A,WRDP
	JRST RCHNW2

RCHNC:	CAMN C,ENDTST
	POPJ P,
	ADD C,JMPOFF
	TRNN C,-1
	AOSLE BLKCNT
	POPJ P,
	HLRM C,WRDP
	JRST RCHNW2
APNT:	(A).		;RH GETS CLOBBERED AT SETPR2 TIME
WRD:	0↔-1
ENDTST:	20

IBUF:	BLOCK	3
OBUF:	BLOCK	3
ENTR:	BLOCK	4
FILE:	BLOCK	4
PDL:	BLOCK LPDL

JBTLIN:	0
LETAB:	0
PPCALL:	0
TPJMP:	0
TBLKPT:	0
DPYHT:	0

LINN:	0
CHRP:	0
BLKCNT:	0
CCNT:	0
MAYTAB:	0
WRDP:	0
JMPOFF:	0
LEENT:	0
TRMTYP:	0
SLPTIM:	2*=60
CBMST:	0
DLEBUF:	0
DLEPOS:	0
XGETHI:	0
CCHKBEG: 0
EMODE:	0				;nozero if in E mode
EINITD:	0

DLISTP:	0
DLIST:
DLHED:	0				;for E window header
WINBLK:	BLOCK	MAXWIN			;for E window lines
DLTRL:	0				;for E window trailer
DLISTL:	0				;for PP

;	XDPYBU+DPYBSZ-1,,XDPYBU		;for E body

WINLIN:	0
HEDBLK:	0
TRLBLK:	0

ANXTLN:	0

buffpt:	200000,,PPAGE			;double field mode
	0
	0
	PPAGE+1

ersbuf:	BYTE (8) 17,0,46 (3) 1,2,1,4	;funct. code, chan select, funct. code
	0
erspt:	ersbuf
	erspt-ersbuf
	0
	0

DDAGE:	BYTE (8) 46,0,46 (3) 1,2,1,4
	BYTE (8) 2,1,10 (3)3,4,5,4

DMAGE:	BYTE (7) 177,30,177,30,177
	BYTE (7) 30,177,14,140,142

IIAGE:	BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6
	BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6

PPAGE:	BYTE (8) 46,0,46 (3) 1,2,1,4
	BYTE (8) 2,1,10 (3)3,4,5,4
	REPEAT	BFSZ,{1}

WINTXT:	BLOCK	WTXTSZ

	END START